/*
 * pps_bom
 */
package com.pitop.assembly.service;

import com.pitop.assembly.entity.Assembly;
import com.pitop.assembly.entity.AssemblyState;
import com.pitop.core.base.BaseSV;

import java.util.List;

/**
 * 组件
 *
 * @author berton
 */
public interface AssemblySV extends BaseSV<Assembly, Long> {

    /**
     * 加载一个对象Assembly
     *
     * @param id
     * @param code 编码
     * @return Assembly
     */
    Assembly load(java.lang.Long id, java.lang.String code);

    /**
     * 加载一个对象Assembly详情，(将查询关联数据)
     *
     * @param id
     * @param code 编码
     * @return Assembly
     */
    Assembly get(java.lang.Long id, java.lang.String code);

    /**
     * 加载一个对象Assembly 通过id
     *
     * @param id
     * @return Assembly
     */
    Assembly loadById(java.lang.Long id);

    /**
     * 加载一个对象Assembly 通过code
     *
     * @param code 编码
     * @return Assembly
     */
    Assembly loadByCode(java.lang.String code);

    /**
     * 加载一个对象Assembly 通过name
     *
     * @param name 名称
     * @return Assembly
     */
    Assembly loadByName(java.lang.String name);

    /**
     * 加载一个对象Assembly 通过assemblyCode
     *
     * @param assemblyCode 组件代码
     * @return Assembly
     */
    Assembly loadByAssemblyCode(java.lang.String assemblyCode);

    /**
     * 加载一个对象Assembly 通过id,(将查询关联数据)
     *
     * @param id
     * @return Assembly
     */
    Assembly getById(java.lang.Long id);

    /**
     * 加载一个对象Assembly 通过code,(将查询关联数据)
     *
     * @param code 编码
     * @return Assembly
     */
    Assembly getByCode(java.lang.String code);

    /**
     * 根据主键id,oldStates 共同更新 Assembly 的状态到newState状态
     *
     * @param id
     * @param newState  新状态
     * @param oldStates 旧状态集合
     */
    void updateStateById(java.lang.Long id, AssemblyState newState, AssemblyState... oldStates);

    /**
     * 根据主键code,oldStates 共同更新 Assembly 的状态到newState状态
     *
     * @param code      编码
     * @param newState  新状态
     * @param oldStates 旧状态集合
     */
    void updateStateByCode(java.lang.String code, AssemblyState newState, AssemblyState... oldStates);

    /**
     * 根据主键id 更新 Assembly 的状态到另一个状态
     *
     * @param id
     * @param state 状态
     */
    void updateById(java.lang.Long id, AssemblyState state);

    /**
     * 根据主键code 更新 Assembly 的状态到另一个状态
     *
     * @param code  编码
     * @param state 状态
     */
    void updateByCode(java.lang.String code, AssemblyState state);

    /**
     * 删除对象Assembly
     *
     * @param id @param code 编码
     * @return Assembly
     */
    void delete(java.lang.Long id, java.lang.String code);

    /**
     * 查询Assembly分页
     *
     * @param assembly 组件
     * @param offset   查询开始行
     * @param limit    查询行数
     * @return List<Assembly>
     */
    List<Assembly> list(Assembly assembly, int offset, int limit);

    int count(Assembly assembly);

    /**
     * 查询Assembly分页
     *
     * @param id     * @param code  编码
     * @param offset 查询开始行
     * @param limit  查询行数
     * @return List<Assembly>
     */
    List<Assembly> list(java.lang.Long id, java.lang.String code, int offset, int limit);

    int count(java.lang.Long id, java.lang.String code);


    /**
     * 保存
     *
     * @param assembly 组件信息
     * @param account  账户
     * @param code     编码
     */
    void save(Assembly assembly, String account, String code);

    /**
     * 修改组件
     * * * 1.参数合法性验证
     * ****1.1 参数是否为空
     * ****1.2 根据组件编码查询组件
     * ****1.3 组件名称是否已经存在，组件代码是否已经存在
     * ****1.4 组件类型编码是否有效
     * ****1.5 组件上级编码是否正确
     * 2.上级编码是否存在，如果不存在，设置组件级别为1级；如果存在，上级组件级别加1
     * 3.持久化组件数据：修改
     * 4.持久化构成组件的物料表，添加或修改或删除
     * 5.持久化组件日志
     * 6.图纸信息存在，持久化组件信息：删除重新添加
     *
     * @param assembly 组件信息
     * @param account  账号信息
     * @param code     账号编码
     */
    void modify(Assembly assembly, String account, String code);

    /**
     * 添加组件绑定的物料信息
     *
     * @param code          组件编码
     * @param materialCodes 物料信息
     */
    void addMaterial(String code, String materialCodes);

    /**
     * 修改状态
     *
     * @param code  组件编码
     * @param state 状态
     */
    void updateState(String code, String state);

    /**
     * 根据bom编码查询组件信息
     *
     * @param bomCode bom编码
     * @param name    组件名称
     * @param offset  查询开始行
     * @param limit   查询行数
     * @return List<Assembly>
     */
    List<Assembly> listForBom(String bomCode, String name, int offset, int limit);

    /**
     * 根据bom编码统计组件信息
     *
     * @param bomCode bom编码
     * @param name    组件名称
     * @return int
     */
    int countForBom(String bomCode, String name);

    /**
     * 复制组件
     *
     * @param code          组件编码
     * @param account
     * @param accountCode
     */
    void copy(String code, String account, String accountCode);

}
